<?php
include_once 'automovel.php';
include_once 'cliente.php';
include_once 'configuracoes.php';
include_once 'endereco.php';
include_once 'locacao.php';
include_once 'marca.php';
include_once 'modelo.php';

class DAO {
	
	public function __construct() {
		date_default_timezone_set ('America/Recife');
		
		$host = "localhost";
		$usuario = "joaopaulo";
		$senha = "minicurso";
		$db = "locadora";
		
		mysql_connect($host, $usuario, $senha);
		mysql_select_db($db);
		mysql_set_charset('utf8');
	}

	function busca_automoveis($busca, $disponiveis_primeiro = true) {
		$busca = mysql_real_escape_string($busca);
		
		$order = "";
		if ($disponiveis_primeiro) {
			$order = "a.disponivel DESC, ";
		}
		$order .= "ma.marca ASC, mo.nome ASC, a.ano DESC, a.cor ASC";
		if (!$disponiveis_primeiro) {
			$order = ", a.disponivel DESC";
		}
		
		$consulta = mysql_query("SELECT a.id 
									FROM Automovel a, Modelo mo, Marca ma 
									WHERE a.modelo_id = mo.id 
										AND mo.marca_id = ma.id 
										AND (a.ano = '" . $busca . "'
											OR a.cor LIKE '%" . $busca . "%' 
											OR mo.nome LIKE '%" . $busca . "%' 
											OR ma.nome LIKE '%" . $busca . "%')
									ORDER BY $order");
		$automoveis = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$automoveis[] = $this->get_automovel($id);
		}
		return $automoveis;
	}
	
	function busca_clientes($parte_nome = "") {
		$parte_nome = mysql_real_escape_string($parte_nome);
		$consulta = mysql_query("SELECT id 
									FROM Cliente 
									WHERE nome LIKE '%" . $parte_nome . "%'
									ORDER BY nome");
		$clientes = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$clientes[] = $this->get_cliente($id);
		}
		return $clientes;
	}
	
	function busca_marcas($parte_marca = "") {
		$parte_marca = mysql_real_escape_string($parte_marca);
		$consulta = mysql_query("SELECT id 
									FROM Marca 
									WHERE nome LIKE '%" . $parte_marca . "%' 
									ORDER BY nome");
		$marcas = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$marcas[] = $this->get_marca($id);
		}
		return $marcas;
	}
	
	function busca_modelos($parte_modelo = "") {
		$parte_modelo = mysql_real_escape_string($parte_modelo);
		
		$consulta = mysql_query("SELECT id 
									FROM Modelo 
									WHERE nome LIKE '%" . $parte_modelo . "%'
									ORDER BY nome");
		$modelos = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$modelos[] = $this->get_modelo($id);
		}
		return $modelos;
	}
	
	function consulta_existe_id($tabela, $id) {
		$id = mysql_real_escape_string($id);
		$consulta = mysql_query("SELECT * 
									FROM " . $tabela . "
									WHERE id = " . $id);
		return mysql_num_rows($consulta) > 0;
	}
	
	function consulta_por_id($tabela, $id) {
		$id = mysql_real_escape_string($id);
		$consulta = mysql_query("SELECT *
									FROM " . $tabela . " 
									WHERE id = " . $id);
		if (mysql_num_rows($consulta) == 0) {
			throw new Exception("Não foi encontrado registro com ID $id na tabela $tabela");
		}
		elseif (mysql_num_rows($consulta) > 1) {
			throw new Exception("Consulta inválida com ID $id na tabela $tabela");
		}
		
		return mysql_fetch_assoc($consulta);
	}
	
	function deletar_por_id($tabela, $id) {
		$id = mysql_real_escape_string($id);
		
		$this->consulta_por_id($tabela, $id);
		
		$consulta = mysql_query("DELETE FROM " . $tabela . " 
									WHERE id = " . $id);
		if (!$consulta) {
			throw new Exception("Erro ao deletar registro com ID $id na tabela $tabela: " . mysql_error());
		}
	}
	
	function deletar_automovel(Automovel $automovel) {
		$this->deletar_por_id("Automovel", $automovel->get_id());
	}
	
	function deletar_cliente(Cliente $cliente) {
		$this->deletar_por_id("Cliente", $cliente->get_id());
	}
	
	function deletar_locacao(Locacao $locacao) {
		$this->deletar_por_id("Locacao", $locacao->get_id());
	}
	
	function deletar_marca(Marca $marca) {
		$this->deletar_por_id("Marca", $marca->get_id());
	}
	
	function deletar_modelo(Modelo $modelo) {
		$this->deletar_por_id("Modelo", $modelo->get_id());
	}
	
	function get_automoveis_de_modelo(Modelo $modelo, $so_disponiveis = false, $disponivel_primeiro = true) {
		$modelo->preparar_pra_mysql();
		
		$order = "";
		if ($disponivel_primeiro) {
			$order .= "a.disponivel DESC, ";
		}
		$order .= "a.ano DESC, a.cor ASC";
		if (!$disponivel_primeiro) {
			$order .= ", a.disponivel DESC";
		}
		
		if ($so_disponiveis) {
			$so_disponiveis = " AND a.disponivel = True";
		}
		else {
			$so_disponiveis = "";
		}
		
		$consulta = mysql_query("SELECT a.id 
									FROM Automovel a, Modelo m 
									WHERE m.id = " . $modelo->get_id() . "
										AND m.id = a.modelo_id
										$so_disponiveis
									ORDER BY $order");
		$automoveis = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$automoveis[] = $this->get_automovel($id);
		}
		return $automoveis;
	}
	
	function get_automoveis_de_marca(Marca $marca, $so_disponiveis = false, $disponivel_primeiro = true) {
		$marca->preparar_pra_mysql();
		
		$order = "";
		if ($disponivel_primeiro) {
			$order .= "a.disponivel DESC, ";
		}
		$order .= "a.ano DESC, mo.nome ASC, a.cor ASC";
		if (!$disponivel_primeiro) {
			$order .= ", a.disponivel DESC";
		}
		
		if ($so_disponiveis) {
			$so_disponiveis = " AND a.disponivel = True";
		}
		else {
			$so_disponiveis = "";
		}
		
		$consulta = mysql_query("SELECT a.id
									FROM Automovel a, Modelo mo, Marca ma
									WHERE ma.id = " . $marca->get_id() . "
										AND ma.id = mo.marca_id 
										AND mo.id = a.modelo_id 
										$so_disponiveis
									ORDER BY $order");
		$automoveis = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$automoveis[] = $this->get_automovel($id);
		}
		return $automoveis;
	}
	
	function get_automovel($id) {
		$consulta = $this->consulta_por_id("Automovel", $id);
			
		$automovel = new Automovel();
		$automovel->setar_atributos($consulta);
		$automovel->set_modelo($this->get_modelo($automovel->modelo_id));
		$automovel->set_configuracoes($this->get_configuracoes());
		
		return $automovel;
	}
	
	function get_cliente($id) {
		$consulta = $this->consulta_por_id("Cliente", $id);
		
		$cliente = new Cliente();
		$cliente->setar_atributos($consulta);
		$endereco = new Endereco();
		$endereco->set_rua($cliente->rua); 
		$endereco->set_numero($cliente->numero);
		$endereco->set_complemento($cliente->complemento);
		$endereco->set_bairro($cliente->bairro);
		$endereco->set_cidade($cliente->cidade);
		$endereco->set_estado($cliente->estado);
		$endereco->set_cep($cliente->cep);
		$cliente->set_endereco($endereco);
	
		return $cliente;
	}
	
	function get_configuracoes() {
		$consulta = mysql_query("SELECT diaria_base, condutor_extra, gps, cadeira_bebe, multa
									FROM Configuracoes");
		if (mysql_num_rows($consulta) == 0) {
			throw new Exception("Não foi encontrado registro na tabela Configuracoes");
		}
		elseif (mysql_num_rows($consulta) > 1) {
			throw new Exception("Tabela Configuracoes tem mais de um registro (inválido!)");
		}
		
		list($diaria_base, $condutor_extra, $gps, $cadeira_bebe, $multa) = mysql_fetch_row($consulta);

		$configuracoes = new Configuracoes();
		$configuracoes->set_preco_diaria_base($diaria_base);
		$configuracoes->set_preco_condutor_extra($condutor_extra);
		$configuracoes->set_preco_gps($gps);
		$configuracoes->set_preco_cadeira_bebe($cadeira_bebe);
		$configuracoes->set_preco_multa($multa);
	
		return $configuracoes;
	}
	
	function get_locacao($id) {
		$consulta = $this->consulta_por_id("Locacao", $id);
		
		$locacao = new Locacao();
		$locacao->setar_atributos($consulta);
		$locacao->set_data_mysql($locacao->get_data());
		if (!is_null($locacao->get_data_devolucao())) {
			$locacao->set_data_devolucao_mysql($locacao->get_data_devolucao());
		}
		$locacao->set_cliente($this->get_cliente($locacao->cliente_id));
		$locacao->set_automovel($this->get_automovel($locacao->automovel_id));
		$locacao->set_configuracoes($this->get_configuracoes());

		return $locacao;
	}
	
	function get_locacoes_de_automovel(Automovel $automovel) {
		$automovel->preparar_pra_mysql();

		$locacoes = Array();
		
		$consulta_abertas = mysql_query("SELECT id
											FROM Locacao 
											WHERE automovel_id = " . $automovel->get_id(). "
												AND data_devolucao IS NULL
											ORDER BY data DESC");
		while (list($id) = mysql_fetch_row($consulta_abertas)) {
			$locacoes[] = $this->get_locacao($id);
		}
		
		$consulta_fechadas = mysql_query("SELECT id
											FROM Locacao 
											WHERE automovel_id = " . $automovel->get_id(). "
												AND data_devolucao IS  NOT NULL
											ORDER BY data DESC");
		while (list($id) = mysql_fetch_row($consulta_fechadas)) {
			$locacoes[] = $this->get_locacao($id);
		}
		
		return $locacoes;
	}
	
	function get_locacoes_de_cliente(Cliente $cliente) {
		$cliente->preparar_pra_mysql();
		
		$locacoes = Array();
		
		$consulta_abertas = mysql_query("SELECT id 
											FROM Locacao 
											WHERE cliente_id = " . $cliente->get_id(). "
												AND data_devolucao IS NULL 
											ORDER BY data DESC");
		while (list($id) = mysql_fetch_row($consulta_abertas)) {
			$locacoes[] = $this->get_locacao($id);
		}
		
		$consulta_fechadas = mysql_query("SELECT id
											FROM Locacao 
											WHERE cliente_id = " . $cliente->get_id(). "
												AND data_devolucao IS NOT NULL 
											ORDER BY data DESC");
		while (list($id) = mysql_fetch_row($consulta_fechadas)) {
			$locacoes[] = $this->get_locacao($id);
		}
		return $locacoes;
	}
	
	function get_marca($id) {
		$consulta = $this->consulta_por_id("Marca", $id);
		
		$marca = new Marca();
		$marca->setar_atributos($consulta);
		
		return $marca;
	}
	
	function get_modelo($id) {
		$consulta = $this->consulta_por_id("Modelo", $id);
		
		$modelo = new Modelo();
		$modelo->setar_atributos($consulta);
		$modelo->set_marca($this->get_marca($modelo->marca_id));
		
		return $modelo;
	}
	
	function get_modelos_de_marca(Marca $marca) {
		$marca->preparar_pra_mysql();
		$consulta = mysql_query("SELECT id 
									FROM Modelo 
									WHERE marca_id = " . $marca->get_id() . "
									ORDER BY nome ASC");
		$modelos = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$modelos[] = $this->get_modelo($id);
		}
		return $modelos;
	}
	function get_todos_automoveis($so_disponiveis = false, $disponivel_primeiro = true) {
		$order = "";
		if ($disponivel_primeiro) {
			$order .= "a.disponivel DESC, ";
		}
		$order .= "m.nome ASC, a.ano DESC, a.cor ASC";
		if (!$disponivel_primeiro) {
			$order .= ", a.disponivel DESC";
		}
		
		if ($so_disponiveis) {
			$so_disponiveis = " AND a.disponivel = True";
		}
		else {
			$so_disponiveis = "";
		}
		
		$consulta = mysql_query("SELECT a.id
									FROM Automovel a, Modelo m
									WHERE a.modelo_id = m.id
										$so_disponiveis
									ORDER BY $order");
		$automoveis = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$automoveis[] = $this->get_automovel($id);
		}
		return $automoveis;
	}
	
	function get_todas_marcas() {
		$consulta = mysql_query("SELECT id 
									FROM Marca 
									ORDER BY nome");
		$marcas = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$marcas[] = $this->get_marca($id);
		}
		return $marcas;
	}
	
	function get_todos_modelos() {
		$consulta = mysql_query("SELECT id
									FROM Modelo 
									ORDER BY nome");
		$modelos = Array();
		while (list($id) = mysql_fetch_row($consulta)) {
			$modelos[] = $this->get_modelo($id);
		}
		return $modelos;
	}

	public function salvar_automovel(Automovel $automovel) {
		$automovel->preparar_pra_mysql();
		$this->consulta_existe_id("Modelo", $automovel->get_modelo()->get_id()); // Consulta id do modelo
		if ($this->consulta_existe_id("Automovel", $automovel->get_id())) {
			$salvar = mysql_query("UPDATE Automovel
									SET ano = " . $automovel->get_ano() . ", 
										cor = '" . $automovel->get_cor() . "', 
										modelo_id = " . $automovel->get_modelo()->get_id() . ", 
										disponivel = " . $automovel->get_disponivel() . "
									WHERE id = " . $automovel->get_id());
			$id = $automovel->get_id();
		}
		else {
			$salvar = mysql_query("INSERT INTO Automovel (ano, cor, modelo_id, disponivel) VALUES (
									" . $automovel->get_ano() . ", 
									'" . $automovel->get_cor() . "', 
									" . $automovel->get_modelo()->get_id() . ", 
									" . $automovel->get_disponivel() . ")");
			$id = mysql_insert_id();
		}
	
		if (!$salvar) {
			throw new Exception("Erro ao salvar objeto Automovel: " . mysql_error());
		}
		
		return $this->get_automovel($id);
	}
	
	public function salvar_cliente(Cliente $cliente) {
		$cliente->preparar_pra_mysql();
		if ($this->consulta_existe_id("Cliente", $cliente->get_id())) {
			$salvar = mysql_query("UPDATE Cliente
										SET nome = '" . $cliente->get_nome() . "', 
											email = '" . $cliente->get_email() . "', 
											cpf = '" . $cliente->get_cpf() . "', 
											telefone1 = '" . $cliente->get_telefone1() . "', 
											telefone2 = '" . $cliente->get_telefone2() . "', 
											rua = '" . $cliente->get_endereco()->get_rua() . "', 
											numero = '" . $cliente->get_endereco()->get_numero() . "', 
											complemento = '" . $cliente->get_endereco()->get_complemento() . "', 
											bairro = '" . $cliente->get_endereco()->get_bairro() . "', 
											cidade = '" . $cliente->get_endereco()->get_cidade() . "', 
											estado = '" . $cliente->get_endereco()->get_estado() . "', 
											cep = '" . $cliente->get_endereco()->get_cep() . "'  
										WHERE id = " . $cliente->get_id());
			$id = $cliente->get_id();
		}
		else {
			$salvar = mysql_query("INSERT INTO Cliente (nome, email, cpf, telefone1, telefone2, rua, numero, complemento, bairro, cidade, estado, cep) VALUES (
									'" . $cliente->get_nome() . "', 
									'" . $cliente->get_email() . "', 
									'" . $cliente->get_cpf() . "', 
									'" . $cliente->get_telefone1() . "', 
									'" . $cliente->get_telefone2() . "', 
									'" . $cliente->get_endereco()->get_rua() . "', 
									'" . $cliente->get_endereco()->get_numero() . "', 
									'" . $cliente->get_endereco()->get_complemento() . "', 
									'" . $cliente->get_endereco()->get_bairro() . "', 
									'" . $cliente->get_endereco()->get_cidade() . "', 
									'" . $cliente->get_endereco()->get_estado() . "', 
									'" . $cliente->get_endereco()->get_cep() . "')");
			$id = mysql_insert_id();
		}
	
		if (!$salvar) {
			throw new Exception("Erro ao salvar objeto Cliente: " . mysql_error());
		}
		
		return $this->get_cliente($id);
	}
	
	public function salvar_configuracoes(Configuracoes $configuracoes) {
		$configuracoes->preparar_pra_mysql();
		$consulta_existe = mysql_query ("SELECT * FROM Configuracoes");
		if (mysql_num_rows($consulta_existe) > 0) {
			$salvar = mysql_query("UPDATE Configuracoes 
									SET diaria_base = " . $configuracoes->get_preco_diaria_base() . ", 
										condutor_extra = " . $configuracoes->get_preco_condutor_extra() . ", 
										gps = " . $configuracoes->get_preco_gps() . ", 
										cadeira_bebe = " . $configuracoes->get_preco_cadeira_bebe() . ", 
										multa = " . $configuracoes->get_preco_multa());
		}
		else {
			$salvar = mysql_query("INSERT INTO Configuracoes (diaria_base, condutor_extra, gps, cadeira_bebe, multa) VALUES (
									" . $configuracoes->get_preco_diaria_base() . ", 
									" . $configuracoes->get_preco_condutor_extra() . ", 
									" . $configuracoes->get_preco_gps() . ", 
									" . $configuracoes->get_preco_cadeira_bebe() . ", 
									" . $configuracoes->get_preco_multa() . ")");
		}
		if (!$salvar) {
			throw new Exception("Erro ao salvar objeto Configuracoes: " . mysql_error());
		}
		
		return $this->get_configuracoes();
	}
	
	public function salvar_locacao(Locacao $locacao) {
		$locacao->preparar_pra_mysql();
		$this->consulta_existe_id("Cliente", $locacao->get_cliente()->get_id()); // Consulta id do cliente
		$this->consulta_existe_id("Automovel", $locacao->get_automovel()->get_id()); // Consulta id do automovel
		if ($locacao->get_data_devolucao_mysql() == "") {
			$data_devolucao = "NULL";
		}
		else {
			$data_devolucao = "'" . $locacao->get_data_devolucao_mysql() . "'";
		}
		if ($this->consulta_existe_id("Locacao", $locacao->get_id())) {
			$salvar = mysql_query("UPDATE Locacao 
									SET data = '" . $locacao->get_data_mysql() . "', 
										data_devolucao = " . $data_devolucao . ", 
										diarias = " . $locacao->get_diarias() . ", 
										condutores_extras = " . $locacao->get_condutores_extras() . ", 
										gps = " . $locacao->get_gps() . ", 
										cadeira_bebe = " . $locacao->get_cadeira_bebe() . ", 
										cliente_id = " . $locacao->get_cliente()->get_id() . ", 
										automovel_id = " . $locacao->get_automovel()->get_id() . "
									WHERE id = " . $locacao->get_id());
			$id = $locacao->get_id();
		}
		else {
			$salvar = mysql_query("INSERT INTO Locacao (data, data_devolucao, diarias, condutores_extras, gps, cadeira_bebe, cliente_id, automovel_id) VALUES (
									'" . $locacao->get_data_mysql() . "', 
									" . $data_devolucao . ", 
									" . $locacao->get_diarias() . ", 
									" . $locacao->get_condutores_extras() . ", 
									" . $locacao->get_gps() . ", 
									" . $locacao->get_cadeira_bebe() . ", 
									" . $locacao->get_cliente()->get_id() . ", 
									" . $locacao->get_automovel()->get_id() . ")");
			$id = mysql_insert_id();
		}
		
		if (!$salvar) {
			throw new Exception("Erro ao salvar objeto Locacao: " . mysql_error());
		}
		
		return $this->get_locacao($id);
	}
	
	public function salvar_marca(Marca $marca) {
		$marca->preparar_pra_mysql();
		if ($this->consulta_existe_id("Marca", $marca->get_id())) {
			$salvar = mysql_query("UPDATE Marca
									SET nome = '" . $marca->get_nome() . "'
									WHERE id = " . $marca->get_id());
			$id = $marca->get_id();
		}
		else {
			$salvar = mysql_query("INSERT INTO Marca (nome) VALUES (
									'" . $marca->get_nome() . "')");
			$id = mysql_insert_id();
		}
	
		if (!$salvar) {
			throw new Exception("Erro ao salvar objeto Marca: " . mysql_error());
		}
		
		return $this->get_marca($id);
	}
	
	public function salvar_modelo(Modelo $modelo) {
		$modelo->preparar_pra_mysql();
		$this->consulta_existe_id("Marca", $modelo->get_marca()->get_id()); // Consulta id da marca
		if ($this->consulta_existe_id("Modelo", $modelo->get_id())) {
			$salvar = mysql_query("UPDATE Modelo
										SET nome = '" . $modelo->get_nome() . "', 
											porcentagem_base = " . $modelo->get_porcentagem_base() . ", 
											marca_id = " . $modelo->get_marca()->get_id() . "
										WHERE id = " . $modelo->get_id());
			$id = $modelo->get_id();
		}
		else {
			$salvar = mysql_query("INSERT INTO Modelo (nome, porcentagem_base, marca_id) VALUES (
										'" . $modelo->get_nome() . "', 
										" . $modelo->get_porcentagem_base() . ", 
										" . $modelo->get_marca()->get_id() . ")");
			$id = mysql_insert_id();
		}
	
		if (!$salvar) {
			throw new Exception("Erro ao salvar objeto Modelo: " . mysql_error());
		}
		
		return $this->get_modelo($id);
	}
	
}
?>